package qhy.websocket.qhy_chat_websocket.config;

import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author qiuhongyu
 * @date 2021/1/26 9:47
 */
/**
@ServerEndpoint
这个注解用于标识作用在类上，它的主要功能是把当前类标识成一个WebSocket的服务端
注解的值用户客户端连接访问的URL地址
对外暴露访问的地址，即客户端要访问服务端的websocket的地址（例：ws://localhost:8071//websocket/1）
 */
@ServerEndpoint(value = "/websocket/{userId}")
@Component
public class WebSocketEndpoint {

    //与某个客户端的连接会话，需要通过它来给客户端发送数据
    private Session session;

    /**
     * 连接建立成功调用的方法 session是系统产生的
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userId") String userId) {
        //分解获取的参数，把参数信息，放到sessionkey中，以方便后续使用
//        String queryString = session.getQueryString();
////        HashMap<String, String> maps = HttpContextUtils.parseQueryString(queryString);
////        String userId = maps.get("userId");

//        //把会话存入到连接池中
//        this.session = session;
//        Session put = SessionPool.sessions.put(userId, session);
        Session put = SessionPool.sessions.put(userId, session);
    }

    /**
     * 关闭连接
     */
    @OnClose
    public void onClose(Session session) throws IOException {
        //清除池子数据
        SessionPool.close(session.getId());
        //关闭会话
        session.close();
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     * @param session
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        //群发
//        SessionPool.sendMessage(message);

        //点对点发送
        //前端传递的是这样的json:{"fromUserId":userId,"toUserId":toUserId,"msg":msg};所以可以用map接收
        Map params = JSON.parseObject(message, new HashMap<String, Object>().getClass());
        SessionPool.sendMessage(params);

    }




}
